// 导入 express 模块
const express = require('express')

// 创建 express 的服务器实例
const app = express()
const path = require('path')
const fs = require('fs')

const joi = require('joi').message
// 处理数据庞大的时候
const bodyParser = require('body-parser');
app.use(bodyParser.json({ limit: '5000mb' }));
app.use(bodyParser.urlencoded({ limit: '5000mb', extended: true }));

// 响应数据的中间件
app.use(function (req, res, next) {
    // status = 0 为成功； status = 1 为失败； 默认将 status 的值设置为 1，方便处理失败的情况
    res.cc = function (err, status = 1) {
        res.send({
            // 状态
            status,
            // 状态描述，判断 err 是 错误对象 还是 字符串
            message: err instanceof Error ? err.message : err,
        })
    }
    next()
})






// 错误中间件ex
app.use(function (err, req, res, next) {
    // 数据验证失败
    if (err instanceof joi.ValidationError) return res.cc(err)
    // 未知错误
    res.cc(err)
})





/* 
@params:路由注册
*/
// 导入 cors 中间件
const cors = require('cors')
// 将 cors 注册为全局中间件 解决跨域问题
app.use(cors())
app.use(express.json())
app.use(express.urlencoded({ extended: false }))

app.use('/', express.static(path.join(__dirname, './views/')))


// 导入配置文件
const config = require('./config')

// 解析 token 的中间件
const expressJWT = require('express-jwt')
// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
// app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//] }))


const chat = require('./controller/index.js')
app.use('/api', chat)
/* 
 *删除文件
 */

app.post('/remove_update', (req, res) => {
    let wenjian = req.body.wenjian
    fs.unlink(path.join(__dirname, './uphloads', wenjian), (error) => {
        if (error) {
            console.log(error);
            res.send({ status: 404, message: '删除不成功' })
            return false
        }
        res.send({
            status: 200,
            message: '删除成功'
        })
    })
})





// write your code here...   错误查询
app.use((err, req, res, next) => {
    // 捕获身份认证失败的错误
    if (err.name === 'UnauthorizedError') return res.cc('身份认证失败！,请重新登录')
    // 数据验证失败
    if (err instanceof joi.ValidationError) return res.cc(err)
    // 未知错误
    res.cc(err)
})

// 调用 app.listen 方法，指定端口号并启动web服务器
app.listen(8081, function () {
    console.log('api server running at http://127.0.0.1:8081/index.html')
})